package com.jdk.demo.thread.thread;

/**public StackTraceElement[] getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止，则该方法将返回一个零长度数组。如果返回的数组不是零长度的，则其第一个元素代表堆栈顶，它是该序列中最新的方法调用。最后一个元素代表堆栈底，是该序列中最旧的方法调用。
如果有安全管理器，并且该线程不是当前线程，则通过 RuntimePermission("getStackTrace") 权限调用安全管理器的 checkPermission 方法，查看是否可以获取堆栈跟踪。

某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下，没有该线程堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。

返回：
StackTraceElement 数组，每个数组代表一个堆栈帧。

其中使用的Thread类的第一个方法：
1、public static Thread currentThread()
第二个方法：（阅读Java SE的文档：）
1、public StackTraceElement[] getStackTrace()

返回一个堆栈轨迹元素的数组，代表了这个线程的堆栈情况。

如果：1.这个线程没有被开启；2.这个线程被开启了但是没有被系统运行过（因为线程运行是需要根据一定规律轮换的）；3.这个线程结束了。
这三种情况下getStackTrace()返回的数组长度为0。

如果返回的数组长度不为0，那么数组的第一个元素代表栈顶元素，即是这个调用序列中最recent的方法。

数组的最后一个元素代表栈底元素，即调用序列中最远的一个元素。
 * @author Ziroom
 *
 */
public class StackTraceDemo {
	
	public static void main(String[] args) {
	    StackTraceElement[] stackTraceElements=Thread.currentThread().getStackTrace();
	    System.out.println("The stackTraceElements length:"+stackTraceElements.length);
	    for(int i=0;i<stackTraceElements.length;i++){
	        System.out.println("\n---the  "+i+"  element"+"---");
	        System.out.println("toString:"+stackTraceElements[i].toString());
	        System.out.println("ClassName:"+stackTraceElements[i].getClassName());
	        System.out.println("FileName:"+stackTraceElements[i].getFileName());
	        System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
	        System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
	    }
	    printStackInfos();
	}
	
	private static void printStackInfos(){
	    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
	    System.out.println("\nCalled in printStackInfos() method!!!");
	    System.out.println("The stackTraceElements length:"+stackTraceElements.length);
	    for(int i =0;i<stackTraceElements.length;i++){
	        System.out.println("\n---the  "+i+"  element"+"---");
	        System.out.println("toString:"+stackTraceElements[i].toString());
	        System.out.println("ClassName:"+stackTraceElements[i].getClassName());
	        System.out.println("FileName:"+stackTraceElements[i].getFileName());
	        System.out.println("LineNumber:"+stackTraceElements[i].getLineNumber());
	        System.out.println("MethodName:"+stackTraceElements[i].getMethodName());
	    }
	}

}
